主成分分析简介

概述

主成分分析在机器学习领域中主要用于数据降维. 由于本人是做无线通信的,在通信领域中波束赋形也就是 beamforming用的也是同样的技术. 本文结合来谈谈主成分分析

最大方差

考虑一组M个观测数据${x_m}$, 每个数据是一个n维的数据,目标是将数据投影到一个d维空间 d<n, 同时最大化投影数据的方差.

先看一个直观的图像, 下图为400个二维的数据样本.这二维的数据相关性很大,当数据投影到绿色的箭头的方向上时,方差最大

Correlated Data

考虑将数据投射到1维的情况,也就是在n维的向量空间找到一个向量u,当数据集中的数据投射到该向量上时投射后的数据集具有最大方差,实际上只需要找出向量u的方向即可.所以可以约束向量u的模为1,于是数据投射到该向量上的操作就是数据$x_m$点乘向量u.

投射后的方差为

其中 $x^-$ 为数据集X的均值, $S=\frac{1}{M} \sum(x_m - x^-)(x_m - x^-)^T$ 为数据集X的协方差矩阵. 问题的目标就转换为在约束向量u为单位向量(即$u^Tu=1$)的情况下,最大化$u^T S u$, 采用拉格朗日乘子法将约束优化问题转为无约束优化得到下式

对上式中u求偏导并设为0得到

$S$为nxn的协方差矩阵,$\lambda$为一个标量, $u$为n维向量.

回顾矩阵特征向量的定义, 可知$u$即为矩阵$S$的特征向量, $\lambda$为对应的特征值.

测试代码

import numpy as np
import matplotlib.pyplot as plt

## generate the data
M = 400
x=np.random.randn(2,M)
cov = [[0.95,0.36],[0.36,0.312]]
d = np.matmul(x.T,cov).T

## plot the data
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(d[0],d[1])

## calculate eigen vector
w,v=np.linalg.eig(np.matmul(d,d.T) / M)

## plot the eigen vector
ax.arrow(0, 0, v[0,0], v[1,0], width=0.02,head_width=0.05, head_length=0.1, fc='g', ec='g')

plt.show()

其他

也可以从最小误差的角度看pca的问题.

参考

PRML